/**
 * WebSocket 使用示例
 * 展示如何在应用中集成和使用WebSocket模块
 */

import { initWebSocket, disconnectWebSocket, getWebSocketStatus } from './index'
import { bus } from '@/utils/bus'
import { ElMessage } from 'element-plus'

/**
 * WebSocket 集成示例类
 */
export class WebSocketExample {
    private statusCheckInterval: NodeJS.Timeout | null = null

    /**
     * 初始化WebSocket集成
     */
    init(): void {
        console.log('初始化WebSocket集成...')

        // 初始化WebSocket连接
        initWebSocket()

        // 设置事件监听
        this.setupEventListeners()

        // 开始状态检查
        this.startStatusCheck()
    }

    /**
     * 设置事件监听器
     */
    private setupEventListeners(): void {
        // 监听系统消息
        bus.on('system-message', this.handleSystemMessage.bind(this))

        // 监听打印任务
        bus.on('print-order', this.handlePrintOrder.bind(this))

        // 监听厨信通消息
        bus.on('cxt-order-dish-create', this.handleCXTOrderCreate.bind(this))
        bus.on('cxt-order-dish-update', this.handleCXTOrderUpdate.bind(this))
        bus.on('cxt-change-desk', this.handleCXTChangeDesk.bind(this))

        // 监听订单状态报告
        bus.on('order-state-report', this.handleOrderStateReport.bind(this))
    }

    /**
     * 处理系统消息
     * @param message 系统消息
     */
    private handleSystemMessage(message: any): void {
        console.log('处理系统消息:', message)

        // 根据消息类型显示不同的提示
        if (message.type === 'success') {
            ElMessage.success(message.content || '操作成功')
        } else if (message.type === 'warning') {
            ElMessage.warning(message.content || '警告信息')
        } else if (message.type === 'error') {
            ElMessage.error(message.content || '操作失败')
        } else {
            ElMessage.info(message.content || '系统通知')
        }
    }

    /**
     * 处理打印任务
     * @param task 打印任务
     */
    private handlePrintOrder(task: any): void {
        console.log('处理打印任务:', task)

        const { printerName, printerInfo, printerPage } = task

        // 显示打印提示
        ElMessage.info(`正在打印: ${printerPage} 到打印机 ${printerName}`)

        // 这里可以调用实际的打印逻辑
        // 例如：调用打印API或显示打印预览等
    }

    /**
     * 处理厨信通订单创建
     * @param detail 订单详情
     */
    private handleCXTOrderCreate(detail: any): void {
        console.log('处理厨信通订单创建:', detail)

        // 更新本地订单状态
        // 例如：刷新订单列表、更新桌台状态等
        ElMessage.success('收到新的订单信息')
    }

    /**
     * 处理厨信通订单更新
     * @param detail 订单详情
     */
    private handleCXTOrderUpdate(detail: any): void {
        console.log('处理厨信通订单更新:', detail)

        // 更新本地订单状态
        // 例如：刷新订单列表、更新桌台状态等
    }

    /**
     * 处理厨信通桌台变更
     * @param detail 桌台详情
     */
    private handleCXTChangeDesk(detail: any): void {
        console.log('处理厨信通桌台变更:', detail)

        // 更新桌台状态
        // 例如：刷新桌台列表、更新桌台占用状态等
        ElMessage.info('桌台状态已更新')
    }

    /**
     * 处理订单状态报告
     */
    private handleOrderStateReport(): void {
        console.log('处理订单状态报告')

        // 执行订单状态同步逻辑
        // 例如：检查本地订单状态、同步到服务器等
    }

    /**
     * 开始状态检查
     */
    private startStatusCheck(): void {
        this.statusCheckInterval = setInterval(() => {
            const status = getWebSocketStatus()

            if (!status.isConnected) {
                console.warn('WebSocket连接已断开:', status.state)
                // 可以在这里显示连接状态提示
            }
        }, 5000) // 每5秒检查一次
    }

    /**
     * 停止状态检查
     */
    private stopStatusCheck(): void {
        if (this.statusCheckInterval) {
            clearInterval(this.statusCheckInterval)
            this.statusCheckInterval = null
        }
    }

    /**
     * 清理资源
     */
    destroy(): void {
        console.log('清理WebSocket集成...')

        // 停止状态检查
        this.stopStatusCheck()

        // 移除事件监听
        bus.off('system-message', this.handleSystemMessage.bind(this))
        bus.off('print-order', this.handlePrintOrder.bind(this))
        bus.off('cxt-order-dish-create', this.handleCXTOrderCreate.bind(this))
        bus.off('cxt-order-dish-update', this.handleCXTOrderUpdate.bind(this))
        bus.off('cxt-change-desk', this.handleCXTChangeDesk.bind(this))
        bus.off('order-state-report', this.handleOrderStateReport.bind(this))

        // 断开WebSocket连接
        disconnectWebSocket()
    }

    /**
     * 获取连接状态
     */
    getStatus(): { isConnected: boolean; state: string } {
        return getWebSocketStatus()
    }

    /**
     * 手动重连
     */
    reconnect(): void {
        console.log('手动重连WebSocket...')
        disconnectWebSocket()
        setTimeout(() => {
            initWebSocket()
        }, 1000)
    }
}

// 创建全局实例
export const webSocketExample = new WebSocketExample()

// 便捷函数
export function initWebSocketIntegration(): void {
    webSocketExample.init()
}

export function destroyWebSocketIntegration(): void {
    webSocketExample.destroy()
}

export function getWebSocketIntegrationStatus(): { isConnected: boolean; state: string } {
    return webSocketExample.getStatus()
}

export function reconnectWebSocket(): void {
    webSocketExample.reconnect()
}

// 默认导出
export default webSocketExample
